package cn.jjaw.command.note.load;

import cn.jjaw.command.note.command.MethodMismatchingError;
import cn.jjaw.command.note.command.ObjectMethodCommand;
import cn.jjaw.command.note.command.StaticMethodCommand;
import cn.jjaw.command.worker.command.CommandWorker;

import java.lang.reflect.Method;

public class LoadCommandWorker {
    /**
     * 将带有 Command 注解的方法注册到 CommandWorker 中，仅注册静态方法
     */
    public static <T> void load(CommandWorker commandWorker,Class<T> cl){
        Method[] methods = cl.getDeclaredMethods();
        for (Method method : methods) {
            if (!method.isDefault()) {
                Command command = method.getAnnotation(Command.class);
                if(command!=null){
                    String reg = command.value();
                    if(reg==null){
                        throw new MethodMismatchingError(method+"方法带有Command注解，但是Command上没有指定匹配表达式！");
                    }
                    commandWorker.add(new StaticMethodCommand(reg.split(" "),method));
                }
            }
        }
    }
    /**
     * 将带有 Command 注解的方法注册到 CommandWorker 中，仅注册静实例方法
     */
    public static void load(CommandWorker commandWorker,Object obj){
        Class<?> cl = obj.getClass();
        Method[] methods = cl.getDeclaredMethods();
        for (Method method : methods) {
            if (method.isDefault()) {
                Command command = method.getAnnotation(Command.class);
                if(command!=null){
                    String reg = command.value();
                    if(reg==null){
                        throw new MethodMismatchingError(method+"方法带有Command注解，但是Command上没有指定匹配表达式！");
                    }
                    commandWorker.add(new ObjectMethodCommand(reg.split(" "),method,obj));
                }
            }
        }
    }
}
